home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1995-01-30 | 13.3 KB | 347 lines | [TEXT/.Ob4] |
- Syntax10.Scn.Fnt
- Syntax10b.Scn.Fnt
- FoldElems
- Syntax10.Scn.Fnt
- lowerCol, upperCol : INTEGER;
- BEGIN
- IF pressed THEN
- lowerCol := lightgrey;
- upperCol := darkgrey;
- INC(patX); DEC(patY)
- ELSE
- lowerCol := darkgrey;
- upperCol := lightgrey
- END;
- Display.ReplConst(lowerCol, X, Y, W, 2, Display.replace);
- Display.ReplConst(lowerCol, X+W-2, Y +2, 2, H-2, Display.replace);
- Display.ReplConst(upperCol, X, Y+2, 2, H-2, Display.replace);
- Display.ReplConst(upperCol, X+2, Y+H-2, W-4, 2, Display.replace);
- Display.Dot(upperCol, X, Y+1, Display.replace);
- Display.Dot(upperCol, X+W-2, Y+H-1, Display.replace);
- Display.ReplConst(middlegrey, X+2, Y+2, W-4, H-4, Display.replace);
- IF pat # 0 THEN
- Display.CopyPattern(black, pat, X + patX, Y + patY, Display.paint)
- END
- END DrawButton;
- Syntax10.Scn.Fnt
- BEGIN
- obj.downArrow := downArrow;
- obj.upArrow := upArrow;
- obj.backgroundCol := backgroundCol;
- obj.downW := downPatW; obj.downH := downPatH;
- obj.upW := upPatW; obj.upH := upPatH;
- obj.downdX := 0; obj.downdY := 0;
- obj.updX := 0; obj.updY := 0;
- obj. x := 0; obj.y := 0; obj.w := 0; obj.h := 0;
- obj.sliderdY := 0; obj.sliderH := 0;
- obj.F := NIL
- END Init;
- Syntax10.Scn.Fnt
- VAR h, minSliderH: INTEGER;
- BEGIN
- h := obj.h - 2*obj.w;
- minSliderH := obj.minW + obj.minW DIV 2;
- IF h <= minSliderH THEN
- obj.sliderdY := 0; obj.sliderH := h
- ELSIF length = 0 THEN obj.sliderdY := 0; obj.sliderH := h
- ELSIF (beg = 0) & (length = end) THEN obj.sliderdY := 0; obj.sliderH := h
- ELSE
- obj.sliderH := SHORT(((h-minSliderH)*(end-beg)) DIV length);
- IF obj.sliderH < minSliderH THEN obj.sliderH := minSliderH
- ELSIF obj.sliderH > h THEN obj.sliderH := h END;
- obj.sliderdY := SHORT(((h-minSliderH)*beg) DIV length);
- IF (beg > 0) & (obj.sliderdY = 0) THEN INC(obj.sliderdY) END;
- IF length = end THEN obj.sliderdY := h - obj.sliderH
- ELSIF obj.sliderdY + obj.sliderH >= h THEN
- obj.sliderH := obj.sliderH - (obj.sliderdY - obj.sliderH) DIV 2;
- IF obj.sliderH < minSliderH THEN obj.sliderH := minSliderH
- ELSIF obj.sliderH > h THEN obj.sliderH := h END;
- obj.sliderdY := h - obj.sliderH;
- IF obj.sliderdY > 1 THEN DEC(obj.sliderdY) END
- END
- END
- END CalculateSliderDim;
- Syntax10.Scn.Fnt
- BEGIN
- obj.minW := w;
- obj.x := x; obj.y := y; obj.w := w; obj.h := h;
- IF (obj.minW < obj.downW + 4) & (obj.downW >= obj.upW) THEN obj.minW := obj.downW + 4
- ELSIF (obj.minW < obj.upW + 4) & (obj.upW >= obj.downW) THEN obj.minW := obj.upW + 4
- END;
- obj.downdX := (w - obj.downW) DIV 2;
- obj.downdY := (w - obj.downH) DIV 2 ;
- obj.updX := (w - obj.upW) DIV 2;
- obj.updY := (w - obj.upH+1) DIV 2;
- obj.sliderH := w + w DIV 2;
- obj.sliderdY := 0;
- END SetDim;
- Syntax10.Scn.Fnt
- BEGIN
- END LineDown;
- Syntax10.Scn.Fnt
- BEGIN
- END LineUp;
- Syntax10.Scn.Fnt
- BEGIN
- END PageDown;
- Syntax10.Scn.Fnt
- BEGIN
- END PageUp;
- Syntax10.Scn.Fnt
- VAR x, y, w, h, sdY, sH: INTEGER;
- BEGIN
- x := obj.x; y := obj.y + obj.w;
- w := obj.w; h := obj.h - 2*w;
- sdY := obj.sliderdY; sH := obj.sliderH;
- IF obj.minW # w THEN
- Display.ReplConst(backCol, x, y, w, h, Display.replace)
- ELSIF (h < w + w DIV 2) THEN
- Display.ReplConst(obj.backgroundCol, x, y, w, h, Display.replace)
- ELSE
- IF sdY > 0 THEN
- Display.ReplConst(obj.backgroundCol, x, y+h-sdY, w, sdY, Display.replace)
- END;
- DrawButton(pressed, 0, 0, 0, x, y+h-sdY-sH, w, sH);
- IF h - sdY - sH > 0 THEN
- Display.ReplConst(obj.backgroundCol, x, y, w, h - sdY - sH, Display.replace)
- END
- END
- END DrawSlider;
- Syntax10.Scn.Fnt
- BEGIN
- obj.CalculateSliderDim(length, beg, end);
- obj.DrawSlider(sliderPressed)
- END Update;
- Syntax10.Scn.Fnt
- BEGIN
- END UpdateView;
- Syntax10.Scn.Fnt
- VAR pat: Display.Pattern;
- BEGIN
- DrawButton(pressed, obj.downArrow, obj.downdX, obj.downdY, obj.x, obj.y, obj.w, obj.w)
- END DrawDownButton;
- Syntax10.Scn.Fnt
- BEGIN
- DrawButton(pressed, obj.upArrow, obj.updX, obj.updY, obj.x, obj.y+obj.h-obj.w, obj.w, obj.w)
- END DrawUpButton;
- Syntax10.Scn.Fnt
- BEGIN
- IF obj.h < obj.minW*2 THEN
- Display.ReplConst(obj.backgroundCol, obj.x, obj.y, obj.w, obj.h, Display.replace)
- ELSE
- obj.DrawUpButton(FALSE);
- obj.DrawSlider(FALSE);
- obj.DrawDownButton(FALSE)
- END
- END Draw;
- Syntax10.Scn.Fnt
- VAR fast, pressed: BOOLEAN; keys : SET; x, y, w, h: INTEGER;
- BEGIN
- x := obj.x; y := obj.y; w := obj.w; h := w;
- Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- pressed := FALSE;
- suspendTime := Input.Time();
- fast := FALSE;
- REPEAT
- IF ~pressed & (x <= mx) & (mx < x + w) & (y <= my) & (my < y + h) THEN
- pressed := TRUE;
- obj.DrawDownButton(pressed)
- ELSIF pressed & ((mx < x) OR (x + w <= mx) OR (my < y) OR (y + h <= my)) THEN
- pressed := FALSE;
- obj.DrawDownButton(pressed)
- END;
- IF pressed & (keysum # {}) THEN
- time := Input.Time();
- IF time >= suspendTime THEN
- IF fast THEN suspendTime := time + lowDelay
- ELSE fast := TRUE; suspendTime := time + middleDelay
- END;
- obj.LineUp
- END
- END;
- Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- keysum := keysum + keys
- UNTIL keys = {};
- obj.DrawDownButton(FALSE)
- END TrackDownButton;
- Syntax10.Scn.Fnt
- VAR fast, pressed: BOOLEAN; keys : SET; x, y, w, h: INTEGER;
- BEGIN
- x := obj.x; y := obj.y + obj.h - obj.w; w := obj.w; h := w;
- Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- pressed := FALSE;
- suspendTime := Input.Time();
- fast := FALSE;
- REPEAT
- IF ~pressed & (x <= mx) & (mx < x + w) & (y <= my) & (my < y + h) THEN
- pressed := TRUE;
- obj.DrawUpButton(pressed)
- ELSIF pressed & ((mx < x) OR (x + w <= mx) OR (my < y) OR (y + h <= my)) THEN
- pressed := FALSE;
- obj.DrawUpButton(pressed)
- END;
- IF pressed & (keysum # {}) THEN
- time := Input.Time();
- IF time >= suspendTime THEN
- IF fast THEN suspendTime := time + lowDelay
- ELSE fast := TRUE; suspendTime := time + middleDelay
- END;
- obj.LineDown
- END
- END;
- Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- keysum := keysum + keys
- UNTIL keys = {};
- obj.DrawUpButton(FALSE)
- END TrackUpButton;
- Syntax10.Scn.Fnt
- VAR
- keys: SET;
- x, y, w, h, sH, sdY, dY, minH, myOld, myHelp, dYOld, delta: INTEGER;
- BEGIN
- x := obj.x; y := obj.y + obj.w; w := obj.w; h := obj.h - 2*obj.w;
- sH := obj.sliderH; sdY := obj.sliderdY;
- minH := obj.minW + obj.minW DIV 2;
- dYOld := sdY; dY := sdY;
- myOld := my; delta := 0;
- Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- obj.DrawSlider(TRUE);
- REPEAT
- myHelp := my;
- IF (keysum # {}) & (delta # 0) THEN
- obj.UpdateView(TRUE,dY)
- END;
- Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- keysum := keysum + keys;
- delta := myHelp - my;
- dY := sdY + (myOld - my);
- IF ((delta > 0 ) & (dY <= obj.sliderdY)) OR ((delta < 0) & (dY >= obj.sliderdY)) THEN delta := 0 END;
- IF (delta > 0) & (h = obj.sliderdY + obj.sliderH) THEN
- myOld := my; sdY := obj.sliderdY; delta := 0;
- IF myOld < y THEN myOld := y END
- ELSIF (delta < 0) & (obj.sliderdY = 0 ) THEN
- myOld := my; sdY := 0; delta := 0;
- IF myOld >= y + h THEN myOld := y + h - 1 END
- END;
- IF dY < 0 THEN dY := 0
- ELSIF dY > h - minH THEN dY := h - minH
- END;
- UNTIL keys = {};
- IF keysum # Cancel THEN
- obj.DrawSlider(FALSE)
- ELSE
- obj.UpdateView(FALSE, dYOld)
- END
- END TrackSlider;
- Syntax10.Scn.Fnt
- VAR keys: SET; fast: BOOLEAN;
- BEGIN
- suspendTime := Input.Time();
- IF my >= obj.y + obj.h -obj.w - obj.sliderdY THEN
- Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- fast := FALSE;
- REPEAT
- IF (keysum # {}) & (my >= obj.y + obj.h -obj.w - obj.sliderdY) & (my < obj.y + obj.h -obj.w) THEN
- time := Input.Time();
- IF time >= suspendTime THEN
- IF fast THEN suspendTime := time + middleDelay
- ELSE fast := TRUE; suspendTime := time + highDelay
- END;
- obj.PageUp
- END
- END;
- Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- keysum := keysum + keys
- UNTIL keys = {};
- ELSIF my >= obj.y + obj.h -obj.w -obj.sliderdY - obj.sliderH THEN
- obj.TrackSlider(mx, my, keysum)
- ELSE
- Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- fast := FALSE;
- REPEAT
- IF (keysum # {}) & (my >= obj.y + obj.w) & (my < obj.y + obj.h -obj.w - obj.sliderdY - obj.sliderH) THEN
- time := Input.Time();
- IF time >= suspendTime THEN
- IF fast THEN suspendTime := time + middleDelay
- ELSE fast := TRUE; suspendTime := time + highDelay
- END;
- obj.PageDown
- END
- END;
- Input.Mouse(keys, mx, my); Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, mx, my);
- keysum := keysum + keys
- UNTIL keys = {};
- END
- END TrackSliderBar;
- Syntax10.Scn.Fnt
- BEGIN
- obj.F := F;
- IF (keysum # {}) & (obj.w >= obj.minW) & (obj.h >= 2*obj.w) THEN
- Oberon.RemoveMarks(obj.x, obj.y, obj.w, obj.h);
- IF my < obj.y + obj.w THEN obj.TrackDownButton(mx, my, keysum)
- ELSIF my >= obj.y + obj.h - obj.w THEN obj.TrackUpButton(mx, my, keysum)
- ELSIF obj.h >= 2*obj.w + obj.sliderH THEN obj.TrackSliderBar(mx, my, keysum)
- END;
- END
- END HandleScrollBar;
- Syntax10.Scn.Fnt
- highDelay := Input.TimeUnit DIV 2;
- middleDelay := Input.TimeUnit DIV 3;
- lowDelay := Input.TimeUnit DIV 18;
- backgroundCol := middlegrey;
- upArrowImage[0] := {}; downArrowImage[0] := {};
- upArrowImage[1] := {2..4}; downArrowImage[7] := {2..4};
- upArrowImage[2] := {2..4}; downArrowImage[6] := {2..4};
- upArrowImage[3] := {2..4}; downArrowImage[5] := {2..4};
- upArrowImage[4] := {0..6}; downArrowImage[4] := {0..6};
- upArrowImage[5] := {1..5}; downArrowImage[3] := {1..5};
- upArrowImage[6] := {2..4}; downArrowImage[2] := {2..4};
- upArrowImage[7] := {3}; downArrowImage[1] := {3};
- upArrow := Display.NewPattern(upArrowImage, 7, 7);
- downArrow := Display.NewPattern(downArrowImage, 7, 7);
- downPatW := 7; downPatH := 7;
- upPatW := 7; upPatH := 7;
- MODULE ScrollBars;
- IMPORT Display, Input, Oberon;
- CONST
- MR = 0; MM = 1; ML = 2; Cancel = {ML, MM, MR};
- black = 15; darkgrey = 14; middlegrey = 13; lightgrey = 12; white = 0;
- patternCol = darkgrey; backCol = white;
- ScrollBarElem* = POINTER TO ScrollBarElemDesc;
- ScrollBarElemDesc* = RECORD
- F*: Display.Frame;
- x-, y-, w-, h-: INTEGER;
- minW-, sliderdY-, sliderH-: INTEGER;
- backgroundCol: INTEGER;
- downArrow, upArrow: Display.Pattern;
- downdX, downdY, updX, updY: INTEGER;;
- downW, downH, upW, upH: INTEGER;
- END;
- backgroundCol: INTEGER;
- downArrow, upArrow: Display.Pattern;
- downArrowImage, upArrowImage, pat: ARRAY 9 OF SET;
- downPatW, upPatW, downPatH, upPatH: INTEGER;
- lowDelay, middleDelay, highDelay, suspendTime, time: LONGINT;
- PROCEDURE DrawButton(pressed: BOOLEAN; pat: Display.Pattern; patX, patY, X, Y, W, H: INTEGER);
- PROCEDURE (obj: ScrollBarElem) Init*;
- PROCEDURE (obj: ScrollBarElem) CalculateSliderDim* (length, beg, end: LONGINT);
- PROCEDURE (obj: ScrollBarElem) SetDim* (x, y, w, h: INTEGER);
- PROCEDURE (obj: ScrollBarElem) LineDown*;
- PROCEDURE (obj: ScrollBarElem) LineUp*;
- PROCEDURE (obj: ScrollBarElem) PageDown*;
- PROCEDURE (obj: ScrollBarElem) PageUp*;
- PROCEDURE (obj: ScrollBarElem) DrawSlider* (pressed : BOOLEAN);
- PROCEDURE (obj: ScrollBarElem) Update* (sliderPressed: BOOLEAN; length, beg, end: LONGINT);
- PROCEDURE (obj: ScrollBarElem) UpdateView*(pressed: BOOLEAN; dY: INTEGER);
- PROCEDURE (obj: ScrollBarElem) DrawDownButton* (pressed : BOOLEAN);
- PROCEDURE (obj: ScrollBarElem) DrawUpButton* (pressed : BOOLEAN);
- PROCEDURE (obj: ScrollBarElem) Draw*;
- PROCEDURE (obj: ScrollBarElem) TrackDownButton* (VAR mx, my : INTEGER; VAR keysum : SET);
- PROCEDURE (obj: ScrollBarElem) TrackUpButton* (VAR mx, my : INTEGER; VAR keysum : SET);
- PROCEDURE (obj: ScrollBarElem) TrackSlider* (VAR mx, my : INTEGER; VAR keysum : SET);
- PROCEDURE (obj: ScrollBarElem) TrackSliderBar*(VAR mx, my : INTEGER; VAR keysum : SET);
- PROCEDURE (obj: ScrollBarElem) HandleScrollBar* (F: Display.Frame; mx, my : INTEGER;
- keysum : SET);
- BEGIN
- END ScrollBars.
-